package com.zlsy.springbootdemo.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.elasticsearch.index.VersionType;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * @author zhouliang
 * @date 2020/5/30 11:47
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "movie", shards = 1, replicas = 0, createIndex = false, versionType = VersionType.EXTERNAL)
public class Movie implements Serializable {

    /**
     * @ Document: 在类级别应用，以指示该类是映射到数据库的候选对象。最重要的属性是
     *   indexName:  用于存储此实体的索引的名称
     *   type: 映射类型。如果未设置，则使用小写的类的简单名称。（从版本4.0开始不推荐使用）
     *   shards: 索引的分片数
     *   replicas: 索引的副本数。
     *   refreshIntervall: 索引的刷新间隔。用于索引创建。默认值为“ 1s”。
     *   indexStoreType: 索引的索引存储类型。用于索引创建。默认值为“ fs”。
     *   createIndex: 配置是否在存储库引导中创建索引。默认值为true。
     *   versionType: 版本管理的配置。默认值为EXTERNAL。
     * @ Id : 在字段级别应用，以标记用于标识目的的字段
     * @ Transient: 默认情况下，存储或检索文档时，所有字段都映射到文档，此注释不包括该字段
     * @ PersistenceConstructor: 标记从数据库实例化对象时要使用的给定构造函数，甚至是受保护的程序包。构造函数参数按名称映射到检索到的Document中的键值。
     * @ Field: 在字段级别应用并定义字段的属性，大多数属性映射到各自的Elasticsearch映射定义
     *      name: 字段名称，将在Elasticsearch文档中表示，如果未设置，则使用Java字段名称。
     *      type: the field type, can be one of Text, Keyword, Long, Integer, Short, Byte, Double, Float, Half_Float, Scaled_Float, Date, Date_Nanos, Boolean, Binary, Integer_Range, Float_Range, Long_Range, Double_Range, Date_Range, Ip_Range, Object, Nested, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type.
     *      format: DateFormat.custom 加上 pattern就是自定义。type = FieldType.Date
     *      store：标记是否将原始字段值存储在Elasticsearch中，默认值为false。
     *      analyzer，searchAnalyzer，normalizer：用于指定自定义自定义分析和正规化。
     * @ GeoPoint：将字段标记为geo_point数据类型。如果字段是GeoPoint类的实例，则可以省略。
     */

    /**
     * 演员列表
     */
    @Field(name = "cast", type = FieldType.Object)
    private List<MovieCast> movieCasts;

    /**
     * 电影简介
     */
    @Field(name = "overview", type = FieldType.Text, analyzer = "english")
    private String overview;

    /**
     * 受欢迎程度
     */
    @Field(name = "popularity", type = FieldType.Double)
    private Double popularity;

    /**
     * 上线时间
     */
    @Field(name = "release_date", type = FieldType.Date)
    private Date releaseDate;

    /**
     * 宣传词
     */
    @Field(name = "tagline", type = FieldType.Text, analyzer = "english")
    private String tagline;

    /**
     * 电影标题
     */
    @Field(name = "title", type = FieldType.Text, analyzer = "english")
    private String title;

}
